//
// Created by Leaf on 2025/8/16.
//
//
// oled.cpp
//

#include "oled.h"

// OLED构造函数
OLED::OLED(U8G2* display, const uint8_t* font, uint8_t contrast) : u8g2(display), isInitialized(false), currentFont(font), currentContrast(contrast) {
    // 构造函数中不立即初始化，等待begin()调用
}

// 内部初始化函数
void OLED::initialize(const uint8_t* font, uint8_t contrast) {
    if (u8g2) {
        u8g2->begin();
        u8g2->setFont(font ? font : u8g2_font_ncenB08_tr);
        u8g2->setContrast(contrast);
        isInitialized = true;
    }
}

// 重新初始化OLED，可设置字体、对比度等参数
void OLED::reinitialize(const uint8_t* font, uint8_t contrast) {
    if (u8g2 && isInitialized) {
        if (font) {
            u8g2->setFont(font);
        }
        u8g2->setContrast(contrast);
    }
}

// 初始化OLED
void OLED::begin(const uint8_t* font, uint8_t contrast) {
    if (!isInitialized) {
        initialize(font, contrast);
    } else {
        // 如果已经初始化，则重新配置参数
        reinitialize(font, contrast);
    }
}

// 设置屏幕翻转模式
void OLED::setFlipMode(uint8_t mode) {
    if (u8g2 && isInitialized) {
        u8g2->setFlipMode(mode);
    }
}

// 绘制中文字符
void OLED::drawChinese(uint8_t x, uint8_t y, const char* text) {
    if (isInitialized && text) {
        u8g2->drawUTF8(x, y, text);
    }
}

// 清空屏幕
void OLED::clear() {
    if (isInitialized) {
        u8g2->clearBuffer();
    }
}

// 显示字符串
void OLED::drawString(uint8_t x, uint8_t y, const String& text) {
    if (isInitialized) {
        u8g2->drawStr(x, y, text.c_str());
    }
}

// 显示整数
void OLED::drawInt(uint8_t x, uint8_t y, int number) {
    if (isInitialized) {
        u8g2->drawStr(x, y, String(number).c_str());
    }
}

// 显示浮点数
void OLED::drawFloat(uint8_t x, uint8_t y, float number, uint8_t precision) {
    if (isInitialized) {
        u8g2->drawStr(x, y, String(number, (unsigned int)precision).c_str());
    }
}

// 绘制水平线
void OLED::drawHLine(uint8_t x, uint8_t y, uint8_t width) {
    if (isInitialized) {
        u8g2->drawHLine(x, y, width);
    }
}

// 绘制垂直线
void OLED::drawVLine(uint8_t x, uint8_t y, uint8_t height) {
    if (isInitialized) {
        u8g2->drawVLine(x, y, height);
    }
}

// 绘制空心矩形（框架）
void OLED::drawRect(uint8_t x, uint8_t y, uint8_t width, uint8_t height) {
    if (isInitialized) {
        u8g2->drawFrame(x, y, width, height);
    }
}

// 绘制实心矩形（填充）
void OLED::fillRect(uint8_t x, uint8_t y, uint8_t width, uint8_t height) {
    if (isInitialized) {
        u8g2->drawBox(x, y, width, height);
    }
}

// 绘制位图
void OLED::drawBitmap(uint8_t x, uint8_t y, uint8_t width, uint8_t height, const uint8_t* bitmap) {
    /**
 * @brief 在指定位置绘制位图
 * @param x 位图左上角的X坐标
 * @param y 位图左上角的Y坐标
 * @param width 位图的宽度（像素）
 * @param height 位图的高度（像素）
 * @param bitmap 指向位图数据的指针
 */
    if (isInitialized && bitmap) {
        u8g2->drawBitmap(x, y, width, height, bitmap);
    }
}

// 绘制XBM格式位图
void OLED::drawXBM(uint8_t x, uint8_t y, uint8_t width, uint8_t height, const uint8_t* xbm) {
    /**
 * @brief 在指定位置绘制XBM格式位图
 * @param x 位图左上角的X坐标
 * @param y 位图左上角的Y坐标
 * @param width 位图的宽度（像素）
 * @param height 位图的高度（像素）
 * @param xbm 指向XBM格式位图数据的指针
 */
    if (isInitialized && xbm) {
        u8g2->drawXBM(x, y, width, height, xbm);
    }
}

// 更新显示
void OLED::update() {
    if (isInitialized) {
        u8g2->sendBuffer();
    }
}

// 设置字体
void OLED::setFont(const uint8_t* font) {
    if (isInitialized) {
        u8g2->setFont(font);
    }
}